﻿using Autofac;
using Currency.Infra.Repository;
using Currency.Infra.IRepository;

namespace Currency.Infra.EntityFramework
{
    public class AutofacEfCoreModule : Module
    {
        /// <summary>
        /// Autofac注册
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            //注册UOW
            builder.RegisterType<UnitOfWork<EfCoreDbContext>>()
                   .As<IUnitOfWork>()
                   .InstancePerLifetimeScope();//同一个Lifetime生成的对象是同一个实例

            //注册ef公共BasicRepository
            builder.RegisterGeneric(typeof(EFRepository<>))
                   .UsingConstructor(typeof(EfCoreDbContext))// 自动装配，手动使用特定的构造函数
                   .AsImplementedInterfaces()// 是以接口方式进行注入
                   .InstancePerLifetimeScope();//同一个Lifetime生成的对象是同一个实例

            //注册Repository服务
            builder.RegisterAssemblyTypes(this.ThisAssembly)
                   .Where(t => t.IsClosedTypeOf(typeof(IRepository<>)))
                   .AsImplementedInterfaces()// 是以接口方式进行注入
                   .InstancePerLifetimeScope();//同一个Lifetime生成的对象是同一个实例
        }
    }
}